package vashion.azeroth.common.date;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtil {
	/*** 1毫秒 */
	public static final long ONE_MILLI_SECOND=1l;
	/*** 1秒 */
	public static final long ONE_SECOND=ONE_MILLI_SECOND*1000;
	/*** 1分钟*/
	public static final long ONE_MINUTE=ONE_SECOND*60;
	/*** 1小时 */
	public static final long ONE_HOUR=ONE_MINUTE*60;
	/*** 1天 */
	public static final long ONE_DAY=ONE_HOUR*24;
	/*** 1月 */
	public static final long ONE_MONTH=ONE_DAY*30;
	/*** 1年 */
	public static final long ONE_YEAR=ONE_MONTH*12;
	/*** 1世纪 */
	public static final long ONE_CENTURY=ONE_YEAR*100;
	/**
	 * 2010-08-24 17:44:32.634 Tue +800
	 */
	public static final String ISO_DATE_FORMAT 
	="yyyy-MM-dd HH:mm:ss.SSS EEE Z";
	/**
	 * 2010-08-24 17:44:32
	 */
	public static final String ymdhms_DATE_FORMAT
	= "yyyy-MM-dd HH:mm:ss";
	/**
	 * 2010-08-24 17:44
	 */
	public static final String ymdhm_DATE_FORMAT
	= "yyyy-MM-dd HH:mm";
	/**
	 * 2010-08-24 17:44:32 Tue
	 */
	public static final String ymd_E_DATE_FORMAT
	= "yyyy-MM-dd EEE";
	/**
	 * 2010-08-24
	 */
	public static final String ymd_DATE_FORMAT
	= "yyyy-MM-dd";
	/**
	 * 17:44:32
	 */
	public static final String hms_DATE_FORMAT
	= "HH:mm:ss";
	/**
	 * 17:44
	 */
	public static final String hm_DATE_FORMAT
	= "HH:mm";
	/**
	 * 08/24/2010 Tue
	 */
	public static final String mdy_E_DATE_FORMAT_US
	= "MM/dd/yyyy EEE";
	/**
	 * 08/24/2010
	 */
	public static final String mdy_DATE_FORMAT_US
	= "MM/dd/yyyy";
	/**
	 * 20100824174432
	 */
	public static final String ymdhms_TIME_STAMP_FORMAT
	= "yyyyMMddHHmmss";
	/**
	 * 201008241744
	 */
	public static final String ymdhm_TIME_STAMP_FORMAT
	= "yyyyMMddHHmm";
	/**
	 * 20100824
	 */
	public static final String ymd_TIME_STAMP_FORMAT
	= "yyyyMMdd";
	/**
	 * 174432
	 */
	public static final String hms_TIME_STAMP_FORMAT
	= "HHmmss";
	/**
	 * 2010年8月24日 17:49:45 星期二
	 */
	public static final String chinese_ymdhms_E_DATE_FORMAT
	= "yyyy年MM月dd日 HH:mm:ss EEE";
	/***
	 * 2010年8月24日 17:50:12
	 */
	public static final String chinese_ymdhms_DATE_FORMAT
	= "yyyy年MM月dd日 HH:mm:ss";
	/**
	 * 2010年8月24日
	 */
	public static final String chinese_ymd_DATE_FORMAT
	= "yyyy年MM月dd日";
	/**
	 * 获取对应的日期格式转换对象
	 * @param pattern
	 * @return
	 */
	public static synchronized DateFormat getInstance(String pattern) {
		return new SimpleDateFormat(pattern);
	}
	/**
	 * 取系统当前日期的开始时间（yyyy-MM-dd 00:00:00:000）
	 * @return
	 */
	public static Date getCurrentDateBegin(){
		Date date = new Date();
		return zeroConvertTime(date);
	}
	/**
	 * 将日期后的时间填满 变成(yyyy-MM-dd 23:59:59:999)
	 * @return
	 */
	public static Date getCurrentDateEnd(){
		Date date = new Date();
		return totalConvertTime(date);
	}
	/**
	 * 把日期后的时间归0 变成(yyyy-MM-dd 00:00:00:000)
	 * @param fullDate
	 * @return
	 */
    public static final Date zeroConvertTime(Date fullDate){
        Calendar cal = Calendar.getInstance();       
        cal.setTime(fullDate);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
	}
    /**
     * 将日期后的时间填满 变成(yyyy-MM-dd 23:59:59:999)
     * @param fullDate
     * @return
     */
    public static final Date totalConvertTime(Date fullDate){
    	Calendar cal = Calendar.getInstance();       
    	cal.setTime(fullDate);
    	cal.set(Calendar.HOUR_OF_DAY, 23);
    	cal.set(Calendar.MINUTE, 59);
    	cal.set(Calendar.SECOND, 59);
    	cal.set(Calendar.MILLISECOND, 999);
    	return cal.getTime();
    }
    /**
     * 获取当前日期对用的月份的第一天
     * @param fullDate
     * @return
     */
    public static final Date getFirstDayOfOneMonth(Date fullDate){
        Calendar cal = Calendar.getInstance();       
        cal.setTime(fullDate);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        return cal.getTime();
	}
    /**
     * 获取当前日期对应的月份的最后一天
     * @param fullDate
     * @return
     */
    public static final Date getLastDayOfOneMonth(Date fullDate){
    	Calendar cal = Calendar.getInstance();
    	cal.setTime(fullDate);     
        cal.add(Calendar.MONTH, 1);  //当前月加1 就是下个月     
        cal.set(Calendar.DATE, 1);   //下个月的第一天    
        cal.add(Calendar.DATE, -1);  //下个月的前一天就是上个月的最后一天  	    
    	return cal.getTime();
    }
    /**
     * 将指定日期转换为指定格式
     * @param format
     * @param date
     * @return
     */
    public static final synchronized String dateFormat(DateFormat format,Date date){
    	if(null == format || null == date)
            return "";
    	return format.format(date);
    }
    
    /**
     * ***********
      * 创建日期: 2012-11-8
      * @param format
      * @param date
      * @return 
      * 功能：未验证时间格式,调用时请注意时间格式
     * @throws ParseException 
      *************
     */
    public static final String dateFormat(String format, String dateStr) throws ParseException {
    	if(null == format || null == dateStr)
            return "";
    	SimpleDateFormat df=new SimpleDateFormat(format);
    	Date date = DateUtil.praseDate(dateStr);
    	return dateFormat(df, date);
    }
    
    /**
     * 获取当前时间 如 2010-08-24 18:45:45
     * @return
     */
    public static final String getCurrentDateStr(){
    	return dateFormat(getInstance(ymdhms_DATE_FORMAT), new Date());
    }
    /**
     * 获取当前时间戳 如 20100824184545
     * @return
     */
    public static final String getCurrentDateStamp(){
    	return dateFormat(getInstance(ymdhms_TIME_STAMP_FORMAT), new Date());
    }
    
    /**
     * **
     * 创建日期: 2013-8-22
     * @param 
     * @return String
     * 功能：根据参数时间获取当前时间戳 如 20100824184545,默认取当前时间
     *************
     */
    public static final String getDateStamp(Date date) {
    	if(null == date) {
    		return getCurrentDateStamp();
    	}
    	return dateFormat(getInstance(ymdhms_TIME_STAMP_FORMAT), date);
    }
    /**
     * 将指定时间转换为ymdhms格式 如：2010-08-24 18:57:07e
     * @param date
     * @return
     */
    public static final String ymdhmsFormat(Date date){
        return dateFormat(getInstance(ymdhms_DATE_FORMAT), date);
    }
    /**
     * 获取中文显示的指定时间
     * @param date
     * @return
     */
    public static final String chineseFormat(Date date){
    	return dateFormat(getInstance(chinese_ymdhms_DATE_FORMAT), date);
    }
    /**
     * 获取中文显示的当前时间
     * @return
     */
    public static final String getCurrentChineseDate(){
    	return dateFormat(getInstance(chinese_ymdhms_DATE_FORMAT), new Date());
    }
    /**
     * 将指定格式的数据转换为日期类型
     * @param format
     * @param dateStr
     * @return
     * @throws ParseException
     */
    public static final Date praseDate(DateFormat format,String dateStr) throws ParseException {
		if(null==format || null==dateStr || "".equals(dateStr))
			return null;
		return format.parse(dateStr);
	}
    /**
     * 将日期类型为 2010-08-25 08:53:56 格式的字符数据转换为日期类型
     * @param dateStr
     * @return
     * @throws ParseException
     */
    public static final Date praseDate(String dateStr) throws ParseException {
		return DateUtil.getInstance("yyyy-MM-dd HH:mm:ss").parse(dateStr);
	}
    /**
     * 将中文类型的字符数据转换为日期类型 如 2010年8月25日 08:56:05
     * @param dateStr
     * @return
     * @throws ParseException
     */
    public static final Date praseChineseDate(String dateStr) throws ParseException {
    	return DateUtil.getInstance("yyyy年MM月dd日 HH:mm:ss").parse(dateStr);
    }
    /**
     * 加减时间(当amount为正数是为加，否则为减)
     * @param field  添加的时间域
     * @param date 要添加的时间
     * @param amount 数据量
     * @return
     */
    public static final Date addDate(int field,Date date,int amount) {
    	Calendar cal = Calendar.getInstance();
    	cal.setTime(date);
    	cal.add(field, amount);
    	return cal.getTime(); 
    }
    /**
     * 加减天数
     * @param date
     * @param days
     * @return
     */
    public static final Date addDay(Date date,int days){
    	return addDate(Calendar.DAY_OF_YEAR, date, days);
    }
    /**
     * 加减月数
     * @param date
     * @param months
     * @return
     */
    public static final Date addMonth(Date date,int months){
    	return addDate(Calendar.MONTH, date, months);
    }
    /**
     * 加减年数
     * @param date
     * @param years
     * @return
     */
    public static final Date addYear(Date date,int years){
    	return addDate(Calendar.YEAR, date, years);
    }
    /**
     * 加减分钟数
     * @param date
     * @param minutes
     * @return
     */
    public static final Date addMinute(Date date,int minutes){
    	return addDate(Calendar.MINUTE , date, minutes);
    }
    /**
     * 加减秒数
     * @param date
     * @param seconds
     * @return
     */
    public static final Date addSecond(Date date,int seconds){
    	return addDate(Calendar.SECOND , date, seconds);
    }
    /**
     * 取得指定日期的上一个月的日期点
     * @param date
     * @return
     */
    public static final Date getLastMonth(Date date){
    	return addMonth(date, -1);
    }
    /**
     * 取得指定日期的下一个月的日期点
     * @param date
     * @return
     */
    public static final Date getNextMonth(Date date){
    	return addMonth(date, -1);
    }
    /**
     * 返回指定日期的星期 1 星期一~7 星期日
     * @param date
     * @return
     */
    public static final int getWeek(Date date){
    	Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		int week=cal.get(Calendar.DAY_OF_WEEK)-1;
    	return week==0?7:week;
    }
    
    /**
     * ***********
      * 创建日期: 2012-11-8
      * @param date
      * @return
      * @throws ParseException 
      * 功能：取某个时间的小时,未验证时间格式
      *************
     */
    public static final String getHourOfDay(String date) throws ParseException {
    	if(null == date)
    		return null;
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(praseDate(date));
    	
    	return String.valueOf(calendar.get(Calendar.HOUR_OF_DAY));
    }
    /**
     * 返回指定日期的星期  星期一~星期日
     * @param date
     * @return
     */
    public static final String getWeekStr(Date date){
    	String weeks[]={"日","一","二","三","四","五","六"};
    	Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return "星期"+weeks[cal.get(Calendar.DAY_OF_WEEK)-1];
    }
    /**
     * 两个时间的间隔（计算的数据如果不是整形会被四舍五入，请选择适当的间隔单元）
     * @param date1
     * @param date2
     * @param unit 间隔单元 如 ONE_HOUR(一小时) ONE_DAY(一天) ONE_YEAR(一年)
     * @return
     */
    public static long compare(Date date1,Date date2,long unit) {
    	Long num1 = date1.getTime();
    	Long num2 = date2.getTime();
    	return Math.round((num1-num2)/unit);
    }
    /**
     * 两个时间的间隔的天数（计算的数据如果不是整形会被四舍五入）
     * @param date1
     * @param date2
     * @return
     */
    public static long compareToDay(Date date1,Date date2) {
    	return compare(date1, date2, ONE_DAY);
    }
    /**
     * @Description:比较两个时间间隔的时间，取地板值
     * @param date1
     * @param date2
     * @param unit
     * @return
     */
    public static long compareToFloor(Date date1,Date date2,long unit) {
    	Long num1 = date1.getTime();
    	Long num2 = date2.getTime();
    	return (long) Math.floor((num1-num2)/unit);
    }
    /**
     * @Description:比较两个时间间隔的时间，取天花板值
     * @param date1
     * @param date2
     * @param unit
     * @return
     */
    public static long compareToCell(Date date1,Date date2,long unit) {
    	Long num1 = date1.getTime();
    	Long num2 = date2.getTime();
    	return (long) Math.ceil((num1-num2)/unit);
    }
    
    public static String ymdFormat(Date date){
    	  return dateFormat(getInstance(ymd_DATE_FORMAT), date);
    }
    
    public static String ymdTimeFormat(Date date) {
    	return dateFormat(getInstance(ymd_TIME_STAMP_FORMAT), date);
    }
    
    public static void main(String[] args) throws ParseException {
    	Date date1 = DateUtil.praseDate("2012-03-01 0:00:00");
    	Date date2 = DateUtil.praseDate("2012-04-01 12:00:00");
    	System.out.println(DateUtil.compare(DateUtil.addMonth(date1, 1), date2, DateUtil.ONE_DAY));
    }

    
}
